package biz;

import entity.Dish;
import entity.Order;

import java.io.*;
import java.util.*;

/**
 * Description：吃货联盟订餐系统（美团系统）接口（定制规范和标准）
 * Copyright (c), 2024, lbs
 * This program is protected by copyright laws.
 * Date： 2024年09月26日
 *
 * @author 刘宝顺
 * @version : 1.0
 **/

public interface MeiTuan {
    /**
     * 正常的菜单编号
     */
    List<Integer> COMMON_DISH_NUMBERS = Arrays.asList(1001, 1002, 1003);

    /**
     * 正常提供送餐服务的时间
     */
    int BEGIN_TIME = 10;
    int END_TIME = 20;

    /**
     * 合法的中文或是英数字
     */
    String NORMAL_REGEX_INFO = "^([\\u4e00-\\u9fa5\\u3400-\\u4dbf\\u20000-\\u2a6df\\u2a700-\\u2b73f\\u2b740-\\u2b81f\\u2b820-\\u2ceaf\\uf900-\\ufaff\\ufe30-\\ufe4f]+)|(\\w+)$";

    /**
     * 最大订单数
     */
    int MAX_ORDER_NUMBER = 3;

    /**
     * 准备一个容器，存储本系统所有的信息
     */
    Map<String, Object> MEITUAN_INFOS = new LinkedHashMap<>();

    /**
     * 准备一个集合，存放餐厅的菜品信息
     * 注意：集合中每个元素是Dish的实例
     */
    List<Dish> DISH_INFOS = new LinkedList<>();


    /**
     * 准备一个集合，存放餐厅当天迄今为止的订单信息（餐袋信息）,
     * 为了简化业务，本餐厅每次为8个客人提供服务
     * <p>
     * 注意：一维数组中每个元素是Order的实例
     */
    List<Order> ORDER_INFOS = new LinkedList<>();

    String MEITUAN_FILE_NAME = "meituan";


    /**
     * 获得集合中正常的订单数
     *
     * @return 正常的订单数
     */
    static int getNormalOrderSize() {
        int cnt = 0;
        for (Order order : ORDER_INFOS) {
            if (order.getFlg() == 0) {
                cnt++;
            }
        }
        return cnt;
    }

    /**
     * 从磁盘上读取菜品、订单信息到内存中
     */
    static void readInfosFromDiskFile(File diskFile) {
        //思路：
        //①构建一条磁盘文件到内存的通路，准备通过反序列化的技术读取磁盘中的Map集合到内存中（本质：构建ObjectInputStream的实例）
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(diskFile))) {//③释放资源

            //②重构LinkedHashMap集合的实例，将该集合中元素取出来，填充“菜品”和“订单”集合
            Object obj = ois.readObject();
            if (obj instanceof LinkedHashMap<?, ?>) {
                LinkedHashMap<?, ?> container = (LinkedHashMap<?, ?>) obj;
                ORDER_INFOS.addAll((Collection<? extends Order>) container.get("ORDER_INFOS"));
                DISH_INFOS.addAll((Collection<? extends Dish>) container.get("DISH_INFOS"));
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 将内存中的菜品信息、订单信息保存到磁盘文件中
     */
    static void saveDishsAndOrdersToFile(File diskFile) {
        //思路：
        //1）构建一条内存到磁盘文件的通路，准备进行序列化操作（本质：构建ObjectOutputStream的实例）
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(diskFile))) { //3) 释放资源
            //2)  直接将菜品信息、订单信息对应的综合容器实例之LinkedHashMap序列化到磁盘文件中
            MEITUAN_INFOS.put("ORDER_INFOS", ORDER_INFOS);
            MEITUAN_INFOS.put("DISH_INFOS", DISH_INFOS);
            oos.writeObject(MEITUAN_INFOS);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}
